﻿-------------------------------------------------------------------------------
-- Выделение файлов аля Explorer. © SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Shell_SelectAsExplorer.cfg
return{
  KeyMouseMove="MsLClick"; PriorMouseMove=49;
  KeyMouseSel="ShiftMsLClick"; PriorMouseSel=49;
  KeyMouseAddSel="CtrlMsLClick"; PriorMouseAddSel=49;
  KeyMove="Home End Up Down Left Right PgUp PgDn Tab"; PriorMove=49;
  KeySel="ShiftHome ShiftEnd ShiftUp ShiftDown ShiftLeft ShiftRight ShiftPgUp ShiftPgDn"; PriorSel=49;

  Enable=false;  -- Разрешить полное соответствие с Explorer - выделение текущего файла и запоминание начала выделения.
}
-- Конец файла Profile\SimSU\Shell_SelectAsExplorer.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\Shell_SelectAsExplorerRussian.lng
return{
  DescrMouseMove="Позиционирование на файл мышью с выделением аля Explorer. © SimSU";
  DescrMouseSel="Выделение файлов мышью аля Explorer. © SimSU";
  DescrMouseAddSel="Корректировка выделения мышью аля Explorer. © SimSU";
  DescrMove="Позиционирование на файл клавишами с выделением аля Explorer. © SimSU";
  DescrSel="Выделение файлов клавишами аля Explorer. © SimSU";
}
-- Конец файла Profile\SimSU\Shell_SelectAsExplorerRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Shell_SelectAsExplorerEnglish.lng
return{
  DescrMouseMove="Позиционирование на файл мышью с выделением аля Explorer. © SimSU";
  DescrMouseSel="Выделение файлов мышью аля Explorer. © SimSU";
  DescrMouseAddSel="Корректировка выделения мышью аля Explorer. © SimSU";
  DescrMove="Позиционирование на файл клавишами с выделением аля Explorer. © SimSU";
  DescrSel="Выделение файлов клавишами аля Explorer. © SimSU";
}
-- End of file Profile\SimSU\Shell_SelectAsExplorerEnglish.lng
end end

local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Shell_SelectAsExplorer"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Shell_SelectAsExplorer.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Shell_SelectAsExplorer.cfg") or Settings)()

local SimSU=SimSU or {}
SimSU.Shell_SelectAsExplorer={}
-------------------------------------------------------------------------------
local PANEL
local CurFile

function SimSU.Shell_SelectAsExplorer.WhatPanel()
  return Mouse.Y>(Far.Cfg_Get("Panel.Layout","ColumnTitles")=="true" and 1 or 0) and (
    APanel.Left and APanel.Visible and Mouse.X<APanel.Width-1 and Mouse.Y<APanel.Height-1 and APanel or
    APanel.Left and PPanel.Visible and Mouse.X>APanel.Width-1 and Mouse.Y<PPanel.Height-1 and Mouse.X<APanel.Width+PPanel.Width-1 and PPanel or
    PPanel.Left and PPanel.Visible and Mouse.X<PPanel.Width-1 and Mouse.Y<PPanel.Height-1 and PPanel or
    PPanel.Left and APanel.Visible and Mouse.X>PPanel.Width-1 and Mouse.Y<APanel.Height-1 and Mouse.X<APanel.Width+PPanel.Width-1 and APanel
  )
end

function SimSU.Shell_SelectAsExplorer.MoveSel()
  Keys("AKey"); Panel.Select(0,0); Panel.Select(0,1,1);
  CurFile=Panel.SetPosIdx(0,0)
end

function SimSU.Shell_SelectAsExplorer.MoveWithSel()
  CurFile= S.Enable and CurFile or Panel.SetPosIdx(0,0)
  local _,_,_,key=regex.match(akey(1),"(R?Ctrl)?(R?Alt)?(Shift)?(.+)")
  Keys(key); Panel.Select(0,0)
  if APanel.Left~=PANEL.Left then CurFile=Panel.SetPosIdx(0,0) end
  local NewFile=Panel.SetPosIdx(0,0)
  for i=CurFile,NewFile,NewFile>=CurFile and 1 or -1 do
    Panel.Select(0,1,1,i)
  end
end

function SimSU.Shell_SelectAsExplorer.AddRemSel()
  local _,_,_,key=regex.match(akey(1),"(R?Ctrl)?(R?Alt)?(Shift)?(.+)")
  Keys(key); Panel.Select(0,2,1)
  CurFile= S.Enable and Panel.SetPosIdx(0,0)
end
-------------------------------------------------------------------------------
if not Macro then return {Shell_SelectAsExplorer=SimSU.Shell_SelectAsExplorer} end

local ok, mod = pcall(require,"SimSU.Shell_SelectAsExplorer"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Macro {area="Shell"; key=S.KeyMouseMove; priority=S.PriorMouseMove; description=M.DescrMouseMove;
  condition=function() PANEL=SimSU.Shell_SelectAsExplorer.WhatPanel() return PANEL and S.Enable and Mouse.EventFlags~=2 end;
  action=SimSU.Shell_SelectAsExplorer.MoveSel;
}
Macro {area="Shell"; key=S.KeyMove; priority=S.PriorMove; description=M.DescrMove; flags="EmptyCommandLine";
  condition=function() PANEL=APanel return APanel.Visible and S.Enable end;
  action=SimSU.Shell_SelectAsExplorer.MoveSel;
}
Macro {area="Shell"; key=S.KeyMouseSel; priority=S.PriorMouseSel; description=M.DescrMouseSel;
  condition=function() PANEL=SimSU.Shell_SelectAsExplorer.WhatPanel() return PANEL end;
  action=SimSU.Shell_SelectAsExplorer.MoveWithSel;
}
Macro {area="Shell"; key=S.KeySel; priority=S.PriorSel; description=M.DescrSel; flags="EmptyCommandLine";
  condition=function() PANEL=APanel return APanel.Visible and S.Enable end;
  action=SimSU.Shell_SelectAsExplorer.MoveWithSel;
}
Macro {area="Shell"; key=S.KeyMouseAddSel; priority=S.PriorMouseAddSel; description=M.DescrMouseAddSel;
  condition=function() PANEL=SimSU.Shell_SelectAsExplorer.WhatPanel() return PANEL end;
  action=SimSU.Shell_SelectAsExplorer.AddRemSel;
}
